package leetcode;

//atoi: alphanumeric to integer
public class StringToInteger {

	public static void main(String[] args) {
		String s = "   010";
		StringToInteger object = new StringToInteger();
		System.out.println(object.myAtoi(s));
	}
	
	//atoi( ) 函数会扫描参数 nptr字符串，跳过前面的空白字符（例如空格，tab缩进等，可以通过isspace( )函数来检测），
//	直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时('\0')才结束转换，
//	并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串，那么将返回 0
//	如果超过范围，将返回INT_MAX (2147483647) or INT_MIN (-2147483648) is returned
	public int myAtoi(String str) {
		if (str == null || str.length() <= 0) {
			return 0;
		}
		//要遇到第一个不是空白字符的
		int index = 0;
		while(str.charAt(index) == ' '){
			index++;
		}
		String valid = str.substring(index, str.length());
		System.out.println(valid);
		char[] chas = valid.toCharArray();
		if (!isValid(chas)) {
			return 0;
		}
		boolean isPositive = chas[0] == '-' ? false : true;
		int begin = 0;
		if (chas[0] == '-' || chas[0] == '+') {
			begin = 1;
		}

		// 由于负数的范围比正数大1，所以可以转换为负数
		int res = 0;

		final int minDivider = Integer.MIN_VALUE / 10;
		final int minMod = Integer.MIN_VALUE % 10;

		for (int i = begin; i < chas.length; i++) {
			//遇到非数字字符时，即停止转换
			if(chas[i] < '0' || chas[i] > '9'){
				break;
			}
			if (res < minDivider || (res == minDivider && ('0' - chas[i]) < minMod)) {
				return isPositive ? Integer.MAX_VALUE : Integer.MIN_VALUE;
			} 
			res = res * 10 - (chas[i] - '0');
		}
		if(isPositive && res == Integer.MIN_VALUE){
			return Integer.MAX_VALUE;
		}
		return isPositive ? -res : res;
	}

	//对于atoi而言，首先要将开头的空格给删除
	public boolean isValid(char[] chas) {
		if (chas == null || chas.length <= 0) {
			return false;
		}
//		// 判断是否存在前导0
//		if (chas[0] == '0' && chas.length > 1) {
//			return false;
//		}

		int start = 0;
        if(chas[0] == '+' || chas[0] == '-'){
            start = 1;
        }
        for(int i = start; i < chas.length; i++){
        	//只要有数字，就可以做转换
            if(chas[i] >= '0' && chas[i] <= '9'){
                return true;
            }
        }
		return false;
	}
}
